data chocolate; infile datalines dlm=','; input Brand_Name:$8. Brand_Type:$50. Price:comma8.; datalines; Lindt,Swiss Surfin Bittersweet Gold Bar 300g,$8.50 Lindt,Swiss Milk Chocolate Gold Bar 300g,$8.50 Lindt,Swiss Milk Hazelnut Gold Bar 300g,$8.50 Lindt,Excellence Extra Creamy Bar,$3.85 Lindt,Excellence Intense Mint Bar,$3.85 Lindt,Excellence 70% Cocoa Bar,$3.85 Lindt,Excellence 85% Cocoa Bar,$3.85 Lindt,Excellence White Coconut Bar,$3.85 Lindt,Excellence Intense Orange Bar,$3.85 Lindt,Excellence Chili Bar,$3.85 Lindt,Filled Pistachio Bar,$5.00 Lindt,Filled Orange Bar,$5.00 Lindt,Classic Recipe Double Milk Crisp Bar,$3.50 Lindt,Swiss Bittersweet Bar,$3.85 Lindt,Classic Recipe Milk Chocolate Almond Bar,$3.85 Lindt,Classic Recipe Milk Chocolate Hazelnut Bar,$3.85 Lindt,Classic Recipe Milk Chocolate Bar,$3.85 Lindt,Classic Recipe Double Milk Chocolate Bar,$3.85 Lindt,Les Grandes White Almond Chocolate Bar,$5.00 Lindt,Swiss Bittersweet Bar,$3.85 Lindt,Classic Recipe Milk Chocolate Almond Bar,$3.85 Lindt,Classic Recipe Milk Chocolate Hazelnut Bar,$3.85 Lindt,Classic Recipe Milk Chocolate Bar,$3.85 Lindt,Classic Recipe Double Milk Chocolate Bar,$3.85 Lindt,Les Grandes White Almond Chocolate Bar,5.00 Lindt,Grandeur Milk Hazelnut Chocolate Bar,$5.00 Lindt,Lindor Truffles Milk Chocolate Bar,$3.85 Lindt,Lindor Truffles White Chocolate Bar,$3.85 Lindt,Lindor Truffles 60% Extra Dark Chocolate Bar,$3.85 Lindt,Classic Recipe White Chocolate Bar,$3.85 Lindt,Classic Recipe Dark Chocolate Bar,$3.50 Lindt,Petits Desserts Collection,$32.00 Lindt,Petits Desserts Ballotin,$12.00 Lindt,Lindt Classics 4.4 Oz.,$12.00 Lindt,Gourmet Truffle Box “ Sampler,$6.00 Lindt,Lindor Drum Box,$14.00 Lindt,Lindt Classics 7.3 Oz.,$18.00 Lindt,Lindt Dark Classics 7.2 Oz,$18.00 Lindt,Pralines Elegance Box 4.6 Oz,$20.00 Lindt,Petits Carres Inspiration 140g,$20.00 Lindt,Pralines Finesse 118g,$14.00 Lindt,Pralines Finesse 210g,$22.00 Lindt,Knusper Minis Box,$18.00 Lindt,Lindt Of Switzerland Dark Assortment 145g,$20.00 Lindt,Lindt Yogurt Pralines,$16.00 Lindt,Connaisseurs Milk Chocolate Assortment,$20.00 Lindt,Gourmet Truffles Gift Box,$15.00 Lindt,Classic Assorted Chocolates Gift Box,$15.00 Lindt,Lindor Milk Chocolate Truffles Gift Box,$15.00 Lindt,Crunchy Pralines,$25.00 Lindt,Connaisseurs Boxed Chocolate,$20.00 Lindt,Swiss Luxury Selection 4.9 Oz,$18.00 Lindt,Swiss Luxury Selection 415g,$40.00 Sprungli,Mosaïqu,$45.00 Sprungli,Cube orange,$85.00 Sprungli,Heart-shaped Box Gold,$67.00 Sprungli,Sprüngli House Tin,$40.00 Sprungli,Lilliput Size 1,$24.00 Sprungli,Lilliput Size 2,$55.00 Sprungli,House Assortment,$59.00 Sprungli,Top Ten Size 1,$20.00 Sprungli,Top Ten Size 2,$32.00 Sprungli,Criollo de Maracaibo,$24.00 Sprungli,Bonbonnière Arabesque White,$180.00 Sprungli,Limmat Size 1,$24.00 Sprungli,Limmat Size 2,$42.00 Sprungli,Tin Box Damask,$40.00 Sprungli,BLANC & NOIR - Truffes au Champagne,$36.00 Sprungli,Grand Cru Truffles,$36.00 Sprungli,Truffles Classique Size 1,$32.00 Sprungli,Truffles Classique Size 2,$64.00 Sprungli,Cube Truffles Grand Cru,$21.00 ; *Step 1; proc means data=chocolate mean median; where Brand_Name='Lindt'; title "Lindt Chocolate from Switzerland"; run; *Step 2; options symbolgen; %let B_N=Lindt; %let Stats=mean median; proc means data=chocolate &stats; where Brand_Name="&B_N"; title "&B_N Chocolate from Switzerland"; run; %put _global_; %symdel B_N Stats; %put _global_; %macro delvars; data temp; set sashelp.vmacro; where scope='GLOBAL'; run; data _null_; set temp; call symdel(name); run; %mend delvars; %delvars %put _global_; *Step 3; options mcompilenote=all; %macro means(B_N=Lindt,Stats=mean median); proc means data=chocolate &stats; where Brand_Name="&B_N"; title "&B_N Chocolate from Switzerland"; run; %mend; options symbolgen mprint mlogic; %means() %means(B_N=Sprungli,Stats=mean) %means(Stats=median) *Step 4; libname Candy 'C:\Users\Owner\Documents\SAS Talks\Macro Nov 2012'; options mstored sasmstore=Candy; %macro means(B_N=Lindt,Stats=mean median)/store source; proc means data=chocolate &stats; where Brand_Name="&B_N"; title "&B_N Chocolate from Switzerland"; %if &B_N=Sprungli %then %do; title2 "Sprungli is a division of Lindt Chocolate"; %end; run; %mend; %means() %means(B_N=Sprungli,Stats=mean) %copy means/source; *Step 5; libname Candy 'C:\Users\Owner\Documents\SAS Talks\Macro Nov 2012'; options mstored sasmstore=Candy; %macro means(B_N=Lindt,Stats=mean median)/store source; %let title2=%sysfunc(IFC(&B_N=Sprungli, title2 "Sprungli is a division of Lindt Chocolate", title2)); proc means data=chocolate &stats; where Brand_Name="&B_N"; title "&B_N Chocolate from Switzerland"; &title2; run; %mend; %means() %means(B_N=Sprungli,Stats=mean) options mprint mlogic; %means() %copy means/source; *Step 6; libname Candy 'C:\Users\Owner\Documents\SAS Talks\Macro Nov 2012'; options mstored sasmstore=Candy; %macro means(Stats=mean median)/store source; proc sql; select distinct Brand_Name, count(distinct Brand_Name) into :B_N1-:B_N4,:num from chocolate; quit; /* Alternative Method. */ /* proc sort data=chocolate(keep=Brand_Name) out=c nodupkey; by Brand_Name; run; data _null_; set c end=last; call symputx(cats('B_N',_n_),Brand_Name); if last then call symputx('num',_n_); run; */ %do i=1 %to # %let title2=%sysfunc(IFC(&&B_N&i=Sprungli, title2 "Sprungli is a division of Lindt Chocolate", title2)); proc means data=chocolate &stats; where Brand_Name="&&B_N&i"; title "&&B_N&i Chocolate from Switzerland"; &title2; run; %end; %mend; %means() *Step 7; libname Candy 'C:\Users\Owner\Documents\SAS Talks\Macro Nov 2012'; options mstored sasmstore=Candy; %macro means(Stats=mean median)/store source minoperator; %let i=1; %let onestat=%upcase(%scan(&Stats,&i)); %do %while (&onestat ne ); %if not (%upcase(&onestat) in ALPHA CHARTYPE CLASSDATA CLM COMPLETETYPES CSS CV DATA DESCEND DESCENDING DESCENDTYPES EXCLNPWGT EXCLNPWGTS EXCLUSIVE FW IDMIN KURTOSIS LCLM MAX MAXDEC MEAN MEDIAN MIN MISSING MODE N NDEC NMISS NOLABELS NONOBS NOPRINT NOTHREADS NOTRAP NWAY ORDER P1 P10 P20 P25 P30 P40 P5 P50 P60 P70 P75 P80 P90 P95 P99 PCTLDEF PRINT PRINTALL PRINTALLTYPES PRINTIDS PRINTIDVARS PROBT Q1 Q3 QMARKERS QMETHOD QNTLDEF QRANGE RANGE SKEWNESS STACKODS STACKODSOUTPUT STDDEV STDERR SUM SUMSIZE SUMWGT T THREADS UCLM USS VAR VARDEF) %then %do; %put ERROR: You must specify one of the appropriate statistics.; %put ERROR: Look in SAS Help to see what they are.; %return; %end; %let i=%eval(&i+1); %let onestat=%upcase(%scan(&Stats,&i)); %end; proc sql; select distinct Brand_Name, count(distinct Brand_Name) into :B_N1-:B_N4,:num from chocolate; quit; /* Alternative Method. */ /* proc sort data=chocolate(keep=Brand_Name) out=c nodupkey; by Brand_Name; run; data _null_; set c end=last; call symputx(cats('B_N',_n_),Brand_Name); if last then call symputx('num',_n_); run; */ %do i=1 %to # %let title2=%sysfunc(IFC(&&B_N&i=Sprungli, title2 "Sprungli is a division of Lindt Chocolate", title2)); proc means data=chocolate &stats; where Brand_Name="&&B_N&i"; title "&&B_N&i Chocolate from Switzerland"; &title2; run; %end; %mend; options mprint mlogic; %means() %means(Stats=average)